
package com.csscis.ssm.core.generic;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.csscis.ssm.core.feature.orm.mybatis.Page;

/**
 * 所有自定义Service的顶级接口,封装常用的增删查改操作
 * <p/>
 * Model : 代表数据库中的表 映射的Java对象类型 PK :代表对象的主键类型
 *
 * @author QingHe
 * @since 2014年6月9日 下午6:14:06
 */
public interface GenericService<Model, PK> {

    /**
     * 插入对象
     *
     * @param model
     *            对象
     */
    int insert(Model model);

    /**
     * 插入对象
     *
     * @param model
     *            对象
     * @param request
     *           请求 对象
     */
    int insert(Model model, HttpServletRequest request);

    /**
     * 插入对象
     *
     * @param model
     *            对象
     * @param request
     *           请求 对象
     * @param session
     *           请求对象
     */
    int insert(Model model, HttpServletRequest request, HttpSession session);

    /**
     * 更新对象
     *
     * @param model
     *            对象
     */
    int update(Model model);

    /**
     * 通过主键, 删除对象
     *
     * @param id
     *            主键
     */
    int delete(PK id);

    /**
     * 根据参数对象设置的值 删除对象;
     * 用于满足不根据主键删除的其它条件;
     * 需要在xml里面写sql
     * @param model
     *            实体对象
     */
    int deleteObject(Model model);

    /**
     * 通过主键, 查询对象
     *
     * @param id
     *            主键
     * @return model 对象
     */
    Model selectById(PK id);

    /**
     * 查询多个对象
     *
     * @return 对象集合
     */
    List<Model> selectList();

    /**
     * 查询所有对象
     * @param model 为空时查所有,根据需要设置条件
     * @return
     */
    List<Model> selectAll(Model model);

    /**
     * 分页查询
     *
     * @param page Page 对象
     * @param example
     *            表达式
     * @return
     */
    @SuppressWarnings("rawtypes")
    List<Model> selectByExampleAndPage(Page<Model> page, GenericExample example);

    /**
     * 分页查询
     *
     * @param page Page 对象
     * @param model
     *            实体
     * @return
     */
    List<Model> selectAndPage(Page<Model> page, Model model);

    /**
     * 分页查询，处理返回数据
     *
     * @param pageNo 当前页
     * @param model
     *            实体
     * @return json数据
     */
    String selectPageAndJson(Integer pageNo, Integer pageSize, Model model);

}
